#ifndef HTTP_REQUEST_H
#define HTTP_REQUEST_H

#include <map>
#include <string>
#include <unordered_map>
#include <muduo/base/Timestamp.h>
namespace http
{
    class HttpRequest
    {
    public:
        enum Method
        {
            Invalid = 0,
            Get,
            Post,
            Head,
            Put,
            Delete,
            Options
        };
        enum Version
        {
            Unknown = 0,
            Http10,
            Http11
        };

        HttpRequest()
            : _method(Invalid), _version("Unknown"), _content_length(0)
        {
        }

        ~HttpRequest()
        {
        }

        void setReceiveTime(muduo::Timestamp receive_time);
        muduo::Timestamp getReceiveTime() const { return _receive_time; }
        void setVersion(const std::string &version) { _version = version; } // 设置请求版本
        bool setMethod(const char *start, const char *end);                    // 设置请求方法
        bool setPath(const char *start, const char *end);                      // 设置请求路径
        bool setQuery(const char *start, const char *end);                     // 设置请求参数
        void setPathParams(const std::string &key, const std::string &value);  // 设置请求路径参数
        void addHeader(const char *start, const char *colon, const char *end); // 添加请求头
        std::string getHeader(const std::string &key) const;
        bool setContent(const char *start, const char *end); // 设置请求体
        void setContentLength(size_t length);                // 设置请求体长度
        Method getMethod() const { return _method; }
        std::string getVersion() const { return _version; }
        const std::string &getPath() const { return _path; }
        const std::unordered_map<std::string, std::string> &getPathParams() const { return _path_params; }
        const std::unordered_map<std::string, std::string> &getQuery() const { return _query; }
        const std::map<std::string, std::string> &getHeaders() const { return _headers; }
        const std::string &getContent() const { return _content; }
        size_t getContentLength() const { return _content_length; }
        void swap(HttpRequest &other);
    private:
        Method _method;                                            // 请求方法
        std::string _version;                                       // 请求版本
        std::string _path;                                         // 请求路径
        std::unordered_map<std::string, std::string> _path_params; // 请求路径参数
        std::unordered_map<std::string, std::string> _query;       // 请求参数
        muduo::Timestamp _receive_time;                            // 请求接收时间
        std::map<std::string, std::string> _headers;               // 请求头
        std::string _content;                                      // 请求体
        size_t _content_length;                                    // 请求体长度
    };
}

#endif // HTTP_REQUEST_H